import request from '@/utils/request'

/**
 * API接口类型定义
 */
export interface ApiResponse<T = any> {
    code: number
    data: T
    message: string
}

export interface LoginParams {
    username: string
    password: string
}

export interface UserInfo {
    id: number
    username: string
    email: string
    avatar?: string
    role: string
    createTime: string
}

export interface ListParams {
    page?: number
    pageSize?: number
    keyword?: string
    [key: string]: any
}

export interface ListResponse<T> {
    list: T[]
    total: number
    page: number
    pageSize: number
}

/**
 * 用户相关API
 */
export const userApi = {
    /**
     * 用户登录
     * @param params 登录参数
     * @returns 登录结果
     */
    login(params: LoginParams) {
        return request.post<ApiResponse<{ token: string; userInfo: UserInfo }>>('/auth/login', params)
    },

    /**
     * 获取用户信息
     * @returns 用户信息
     */
    getUserInfo() {
        return request.get<ApiResponse<UserInfo>>('/user/info')
    },

    /**
     * 用户登出
     * @returns 登出结果
     */
    logout() {
        return request.post<ApiResponse<null>>('/auth/logout')
    },

    /**
     * 修改密码
     * @param params 密码参数
     * @returns 修改结果
     */
    changePassword(params: { oldPassword: string; newPassword: string }) {
        return request.post<ApiResponse<null>>('/user/change-password', params)
    },

    /**
     * 更新用户信息
     * @param params 用户信息
     * @returns 更新结果
     */
    updateUserInfo(params: Partial<UserInfo>) {
        return request.put<ApiResponse<UserInfo>>('/user/info', params)
    }
}

/**
 * 文件上传API
 */
export const uploadApi = {
    /**
     * 上传单个文件
     * @param file 文件对象
     * @returns 上传结果
     */
    uploadFile(file: File) {
        const formData = new FormData()
        formData.append('file', file)
        return request.post<ApiResponse<{ url: string; filename: string }>>('/upload/file', formData, {
            headers: {
                'Content-Type': 'multipart/form-data'
            }
        })
    },

    /**
     * 上传多个文件
     * @param files 文件数组
     * @returns 上传结果
     */
    uploadFiles(files: File[]) {
        const formData = new FormData()
        files.forEach(file => {
            formData.append('files', file)
        })
        return request.post<ApiResponse<Array<{ url: string; filename: string }>>>('/upload/files', formData, {
            headers: {
                'Content-Type': 'multipart/form-data'
            }
        })
    },

    /**
     * 删除文件
     * @param url 文件URL
     * @returns 删除结果
     */
    deleteFile(url: string) {
        return request.delete<ApiResponse<null>>('/upload/file', { data: { url } })
    }
}

/**
 * 通用列表API
 */
export const commonApi = {
    /**
     * 获取列表数据
     * @param endpoint API端点
     * @param params 查询参数
     * @returns 列表数据
     */
    getList<T>(endpoint: string, params?: ListParams) {
        return request.get<ApiResponse<ListResponse<T>>>(endpoint, { params })
    },

    /**
     * 获取详情数据
     * @param endpoint API端点
     * @param id 数据ID
     * @returns 详情数据
     */
    getDetail<T>(endpoint: string, id: string | number) {
        return request.get<ApiResponse<T>>(`${endpoint}/${id}`)
    },

    /**
     * 创建数据
     * @param endpoint API端点
     * @param data 创建数据
     * @returns 创建结果
     */
    create<T>(endpoint: string, data: any) {
        return request.post<ApiResponse<T>>(endpoint, data)
    },

    /**
     * 更新数据
     * @param endpoint API端点
     * @param id 数据ID
     * @param data 更新数据
     * @returns 更新结果
     */
    update<T>(endpoint: string, id: string | number, data: any) {
        return request.put<ApiResponse<T>>(`${endpoint}/${id}`, data)
    },

    /**
     * 删除数据
     * @param endpoint API端点
     * @param id 数据ID
     * @returns 删除结果
     */
    delete(endpoint: string, id: string | number) {
        return request.delete<ApiResponse<null>>(`${endpoint}/${id}`)
    },

    /**
     * 批量删除数据
     * @param endpoint API端点
     * @param ids 数据ID数组
     * @returns 删除结果
     */
    batchDelete(endpoint: string, ids: Array<string | number>) {
        return request.delete<ApiResponse<null>>(`${endpoint}/batch`, { data: { ids } })
    }
}

// 导出所有API
export default {
    user: userApi,
    upload: uploadApi,
    common: commonApi
}